package com.feimt.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.feimt.pojo.Category;
import com.feimt.result.R;
import com.feimt.service.CategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author 宋孟林
 * @description
 */
@RestController
@Slf4j
@RequestMapping("/category")
public class CategoryController {
    private CategoryService categoryService;

    @Autowired
    public CategoryController(CategoryService categoryService) {
        this.categoryService = categoryService;
    }

    /**
     * 新增菜品分类，使用菜品种类对象作为json参数传递给前端，调用service的save方法保存到数据库返回是否新增成功
     * @param category 使用种类对象作为形参保存种类对象
     * @return 返回是否成功
     */
    @PostMapping
    public R<String> save(@RequestBody Category category){
        log.info("category:{}", category);
        boolean flag = categoryService.save(category);
        return flag ? R.success("新增分类成功") :  R.error("新增分类失败");
    }

    /**
     * 分类分页查询控制器，
     * @param page 页号
     * @param pageSize 页容量
     * @return 返回分页信息对象
     */
    @GetMapping("/page")
    public R<Page<Category>> page(int page, int pageSize){
        Page<Category> pageInfo = new Page<>(page,pageSize);
        LambdaQueryWrapper<Category> wrapper = new LambdaQueryWrapper<>();
        wrapper.orderByAsc(Category::getSort).orderByDesc(Category::getUpdateTime);
        categoryService.page(pageInfo, wrapper);
        return R.success(pageInfo);
    }

    /**
     * 删除分类逻辑，传入分类的id来实现删除功能，我们使用自定义的remove方法来实现删除分类，
     * 因为我们还要自定义删除逻辑，比如是否和菜品和套菜关联，然后再返回删除成功
     * @param id 根据id删除
     * @return 返回删除成功信息
     */
    @DeleteMapping
    public R<String> delete(Long id){
        log.info("删除分类，id为：{}",id);
        categoryService.remove(id);
        return R.success("分类信息删除成功");
    }

    /**
     * 根据json数据种类对象来更新分类信息
     * @param category 当前种类对象
     * @return 是否修改成功
     */
    @PutMapping
    public R<String> update(@RequestBody Category category){
        log.info("修改分类信息：{}",category);
        boolean flag = categoryService.updateById(category);
        return flag ? R.success("修改分类信息成功") : R.error("修改分类信息失败");
    }

    /**
     * 根据条件查询器，如果类型不为空就根据类型来查找
     * @param category 当前种类
     * @return 返回列出的种类
     */
    @GetMapping("/list")
    public R<List<Category>> list(Category category){
        log.info("分类信息：{}", category);
        LambdaQueryWrapper<Category> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(category.getType() != null, Category::getType, category.getType());
        wrapper.orderByAsc(Category::getSort).orderByAsc(Category::getUpdateTime);
        List<Category> list = categoryService.list(wrapper);
        return R.success(list);
    }
}
